1. 생성 (DB, Table)
데이터 베이스 생성하기
기존에 설치한 Mysql, Mariadb는 DBMS이다. 말 그대로 DB를 관리하는 프로그램이므로 DB가 필요하다.
데이터베이스 설계
데이터 베이스는 테두리라고 생각해야 한다. DB 아래에 테이블들로 데이터를 구성하고 데이터베이스 모델링을 통하여 체계화 해야한다.
Table을 생성하는 방법
- 테이블 설계 ( 예시 )
- 회원 테이블( member)
열 이름(한글) | 영문 이름(컬럼명) | 데이터 형식 | 최대 길이 | 공백 혀용 여부 |
회원 고유 번호 | member_num | 숫자(INT) | 255 | NO 자동생성 |
아이디(PK 기본키) | member_id | 문자(CHAR) | 8글자 | NO |
회원 이름 | member_name | 문자(CHAR) | 5글자 | NO |
주소 | member_addr | 문자(CHAR) | 20글자 | NO |
휴대 전화 번호 | member_phone | VAR CHAR | 11 | NO |
집 전화 번 | member_home_number | VAR-CHAR | 11 | YES |
- 제품 테이블(product table)
열 이름(한글) | 영문 이름(컬럼명) | 데이터 형식 | 최대 길이 | 공백 혀용 여부 |
시리얼 넘버(pki) | product_serial | VARCHAR | 20 | NO |
제품 이름 | product_name | VARCHAR | 30 | NO |
가격 | product_price | FLOAT | ㅤ | NO |
제조일자 | product_manufacture | DATE | ㅤ | NO |
제조회사 | product_company | VARCHAR | ㅤ | NO |
남은수량 | product_remaining | INT | ㅤ | NO |
- 테이블 설계 코드
- Member 테이블
➡️
CREATE TABLE 테이블이름 (속성1, 속성2... )
형식으로 생성- 테이블마다 고유의 값을 나타내는
PRIMARRY KEY
는 필수적입니다.
- 이후에 따라오는
ENGINE
과CHARSET
의 경우 필수는 아니나,CHARSET
의 경우 UTF-8등 인코딩 방식을 지정하지 않으면 DB안에 있는 데이터가 깨질 수 있습니다.
- product 테이블
2. MySQL 데이터 형식
2.1 타입(Data Type)
- 테이블을 정의할 때는 필드별로 저장할 수 있는 타입까지 명시해야 합니다.
- MySQL에서 제공하는 기본 타입은 다음과 같습니다.
- 숫자 타입
- 문자열 타입
- 날짜와 시간 타입
2.2 숫자 타입(Numeric Types)
- MySQL은 SQL 표준에서 지원하는 모든 숫자 타입을 제공합니다.
- 정수 타입(Integer Type)
- 고정 소수점 타입(Fixed-Point Type)
- 부동 소수점 타입(Floating-Point Type)
- 비트값 타입(Bit-Value Type)
1) 정수 타입(Integer Type)
- MySQL은 SQL 표준 정수 타입인
INTEGER
(또는INT
)와SMALLINT
를 제공합니다.
- 또한, 표준 정수 타입의 범위를 더욱 확장한
TINYINT
,MEDIUMINT
,BIGINT
까지 제공하고 있습니다.
- 각 정수 타입에 따라 요구되는 저장 공간과 표현할 수 있는 최댓값과 최솟값이 다릅니다.
- 또한, 정수 타입은 음수까지 표현할 수 있는
SIGNED
타입과 양수만을 표현할 수 있는UNSIGNED
타입으로도 구분됩니다.
2) 고정 소수점 타입(Fixed-Point Type)
- MySQL에서 고정 소수점 타입인
DECIMAL
은 실수의 값을 정확하게 표현하기 위해 사용됩니다.
DECIMAL
에서 사용하는 고정 소수점 방식은 실수를 표현할 때 소수부의 자릿수를 고정하여 표현합니다.
- 즉, 소수부의 자릿수를 미리 정해 놓고, 고정된 자릿수로만 소수 부분을 표현하는 방식입니다.
- M은 소수 부분을 포함한 실수의 총 자릿수를 나타내며, 최댓값은 65입니다.
- D는 소수 부분의 자릿수를 나타내며, D가 0이면 소수부분을 가지지 않는 것입니다.
3) 부종 소수점 타입(Floating-Point Type)
- MySQL에서 부동 소수점 타입인
FLOAT
와DOUBLE
은 실수의 값을 대략적으로 표현하기 위해 사용됩니다.
FLOAT
는 4바이트를 사용하며,DOUBLE
은 8바이트를 사용합니다.
FLOAT
는 정밀도에 필요한 최소한의 비트 수를 명시할 수 있습니다.
- P가 0부터 24까지의 값을 가질때는
FLOAT
값으로 취급되며, 25부터 53까지의 값을 가질때는DOUBLE
값으로 취급됩니다.
4) 비트값 타입(Bit-Value Type)
- MySQL에서 비트값 타입인
BIT
는 비트의 값을 저장합니다.
- 즉, 0과 1로 구성되는 바이너리 값을 저장할 수 있습니다.
- M의 범위는 1부터 64까지 설정할 수 있으며, 명시한 M 비트의 값을 저장할 수 있습니다.
- 만약 명시한 M 비트보다 짧은 길이의 비트 값을 입력하면, 입력한 값 앞에 0을 추가하여 자동으로 길이를 맞춥니다.
2.3 문자열 타입
CHAR / VARCHAR / NCHAR / NVARCHAR
CHAR
와VARCHAR
둘다 문자열 데이터를 저장할 수 있는 타입입니다.
- 하지만 저장 방식과 추출 방식 그리고 최대 길이를 다루는 방식에서 차이점을 가집니다.
CHAR
는 문자열을 길이가 한번 설정되면 그대로 고정되는 고정 길이의 문자열을 다룹니다.
VARCHAR
는 문자열을 길이가 고정되지 않는 가변 길이의 문자열로 다룹니다.
NCHAR
는 길이만큼 고정된 크기의 유니코드 문자열을 저장합니다. 이때, 한글(2바이트), 영문(1바이트)과 같은 다국어 문자를 저장할 때 유용합니다
- MAX은 저장할 수 있는 문자열의 최대 길이를 나타냅니다. (MAX Byte)
CHAR
는 설정한 크기보다 작은 길이의 문자열이 입력되면, 나머지 공간을 공백으로 채워 길이를 M과 같게 만듭니다.
3. 대용량 데이터 다루기
1) TEXT 타입
TEXT
타입은 대용량의 문자열 데이터를 저장할 때 사용합니다.
- MySQL에서는 그 크기에 따라
TINYTEXT
,TEXT
,MEDIUMTEXT
,LONGTEXT
와 같이 분류됩니다.
- 각 타입별로 저장할 수 있는 문자열의 길이와 저장 공간이 다릅니다.
TINYTEXT
: 최대 255바이트 까지의 작은 문자열을 저장.
TEXT
: 최대 65,535바이트 까지의 문자열을 저장.
MEDIUMTEXT
: 최대 16,777,215바이트 까지의 중간 크기의 문자열을 저장.
LONGTEXT
: 최대 4GB 까지의 큰 문자열을 저장.
2) BLOB 타입
BLOB
타입은TEXT
타입과 비슷하게 대용량의 바이너리 데이터를 저장할 때 사용합니다.
- MySQL에서는 그 크기에 따라
TINYBLOB
,BLOB
,MEDIUMBLOB
,LONGBLOB
와 같이 분류됩니다.
- 각 타입별로 저장할 수 있는 바이너리 데이터의 크기와 저장 공간이 다릅니다.
TINYBLOB
: 최대 255바이트 까지의 작은 바이너리 데이터를 저장.
BLOB
: 최대 65,535바이트 까지의 바이너리 데이터를 저장.
MEDIUMBLOB
: 최대 16,777,215바이트 까지의 중간 크기의 바이너리 데이터를 저장.
LONGBLOB
: 최대 4GB 까지의 큰 바이너리 데이터를 저장.
3) CLOB / NCLOB
CLOB
(Character Large OBject),NCLOB
(National Character Large OBject) 타입은 대용량의 문자열 데이터를 저장할 때 사용합니다.
CLOB
은 아스키 문자 집합을 사용하여 문자열을 저장하고,NCLOB
은 유니코드 문자 집합을 사용하여 문자열을 저장합니다.
CLOB
과NCLOB
은VARCHAR
타입과 유사하게 작동하지만, 문자열의 길이 제한이 없다는 점에서 차이가 있습니다.
CLOB
은TEXT
타입과,NCLOB
은MEDIUMTEXT
타입과 유사합니다.
CLOB
: 최대 4GB 까지의 큰 문자열을 저장.
NCLOB
: 최대 4GB 까지의 큰 유니코드 문자열을 저장.
4. 날짜와 시간 타입
1) DATE / DATETIME / TIMESTAMP
DATE
DATE
는 날짜를 저장할 수 있는 타입입니다.- 기본 형식은 'YYYY-MM-DD' 입니다.
DATETIME
DATETIME
은 날짜와 함께 시간까지 저장할 수 있는 타입입니다.- 기본 형식은 'YYYY-MM-DD HH:MM:SS' 입니다.
TIMESTAMP
TIMESTAMP
는 날짜와 시간을 나타내는 타임스탬프를 저장할 수 있는 타입입니다.TIMESTAMP
타입의 필드는 사용자가 별다른 입력을 주지 않으면, 데이터가 마지막으로 입력되거나 변경된 시간이 저장됩니다.- 따라서, 데이터의 최종 변경 시각을 저장하고 확인하는 데 유용하게 사용됩니다.
2) TIME
TIME
TIME
은 시간을 저장할 수 있는 타입입니다.- 기본 형식은 'HH:MM:SS' 입니다.
3) YEAR
YEAR
YEAR
는 연도를 저장할 수 있는 타입입니다.YEAR(2)
는 2자리의 연도를 저장할 수 있으며,YEAR(4)
는 4자리의 연도를 저장할 수 있습니다.
5. DB 엔진
1) MyISAM
- MyISAM은 MySQL에서 가장 오래 된 엔진 중 하나입니다.
- MyISAM은 데이터의 읽기 속도가 빠르고, 인덱스를 사용한 검색 속도가 빠릅니다.
- 하지만, MyISAM은 트랜잭션 처리를 지원하지 않습니다.
- 또한, 테이블 단위로 락(LOCK)이 걸리기 때문에 여러 사용자가 동시에 작업을 할 경우 락 경합으로 인한 딜레이가 발생할 수 있습니다.
- MyISAM은 전체 테이블을 잠그기 때문에 대용량 데이터 처리 시 성능에 문제가 생길 수 있습니다.
2) InnoDB
- InnoDB는 MySQL에서 가장 많이 사용되는 엔진 중 하나입니다.
- InnoDB는 트랜잭션 처리를 지원하고, 롤백(ROLLBACK) 기능을 제공하여 데이터 무결성을 보장합니다.
- 또한, InnoDB는 행 단위 락(ROW LOCK)을 사용하기 때문에 여러 사용자가 동시에 작업해도 락 경합이 발생하지 않습니다.
- InnoDB는 대용량 데이터 처리에도 높은 성능을 보여줍니다.
- 하지만, InnoDB는 MyISAM에 비해 약간의 오버헤드가 발생하기 때문에 속도가 느릴 수 있습니다.
ㅤ | MyISAM | InnoDB |
트랜젝션 | 미지원 | 지원 |
외래키 | 미지원 | 지원 |
모델 복잡도 | 단순 | 복잡 |
무결성 | 미지원 | 지원 |
시스템 자원 사용 | 적음 | 많음 |
복구 | 미지원 | 지원 |
lock | Table level locking | Row level locking |